package com.zygh.dlqwservice.util;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.util.StringUtil;

import com.zygh.dlqwservice.module.entity.Operation;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;


import java.util.*;

public class SendLogUtils {

    /**
     * @ policeId      警员号
     * @ sessionId     session标识
     * @ terminalIp    终端ip
     * @ logType       日志类型//0：登录；1：查询；2：新增；3：修改；4：删除；5：登出；6：其他
     * @ module        功能模块，格式如：通讯录>通讯录查询
     * @ formatParam   请求参数
     * @ response      响应内容
     * @ responseType  响应内容类型html/json  1.json 2.html
     * @ result        访问结果成功失败  成功或失败，失败时要写失败原因
     * @ errorCode     操作失败时错误代码
     * @ errorLog      操作失败时错误原因
     */
   // @Scheduled(cron = "0 0 23 * * ? *")
    public static Boolean sendLog(Operation operation) throws Exception {
        Boolean isTrue = false;
        Map<String, String> param = new HashMap<>(25);
        // 用户标识（警号） 警号、证书sn号、身份证号三者只要一个就行
        param.put("policeId", operation.getPoliceId());
        // 证书sn号
        param.put("sn", operation.getSn());
        // 身份证号
        param.put("cardNo", operation.getCardNo());
        // 请求标识uuid全局唯一   可以为空
        param.put("requestId", operation.getRequestId());
        // session标识    不能为空
        param.put("sessionId", operation.getSessionId());
        // 终端标识ip  发起请求的终端ip地址，不能为空
        param.put("terminalIp", operation.getTerminalIp());
        // 日志来源  字典项，应用唯一标识，需要找集中管控技术支持进行申请
        param.put("source", operation.getSource());
        // 日志类型//0：登录；1：查询；2：新增；3：修改；4：删除；5：登出；6：其他  不能为空
        param.put("logType", operation.getLogType());
        // 功能模块，格式如：通讯录>通讯录查询 不能为空
        param.put("module", operation.getModule());
        // 原始请求参数   可以为空
        param.put("params", operation.getParams());
        // 请求参数（格式化） ，不能为空
        param.put("formatParam", operation.getFormatParam());
        // 访问url   可以为空
        param.put("url", operation.getUrl());
        // uri     可以为空
        param.put("uri", operation.getUri());
        // 访问内容    可以为空
        param.put("content", operation.getContent());
        // 响应内容   不可以为空
        param.put("response", operation.getResponse());
        // 响应内容类型html/json  不能为空  1.json 2.html
        param.put("responseType", operation.getResponseType());
        // 请求耗时（ms）  可以为空
        param.put("responseTime", operation.getResponseTime().toString());
        // 访问结果成功失败  成功或失败，失败时要写失败原因  不能为空
        param.put("result", operation.getResult());
        // 失败原因   可以为空
        param.put("errorCode", operation.getErrorCode());
        // 失败日志   可以为空
        param.put("errorLog", operation.getErrorLog());
        // 源IP       可以为空
        param.put("sourceIp", operation.getSourceIp());
        // 源端口   可以为空
        param.put("sourcePort", operation.getSourcePort().toString());
        // 服务的ip  可以为空
        param.put("destIp", operation.getDestIp());
        // 服务的端口  可以为空
        param.put("destPort", operation.getDestPort().toString());
        // 日志记录时间,时间戳,格式如1519978042000   不能为空
        param.put("time", operation.getTime().toString());


        //市局日志对接
            /*String tokenUrl = "http://62.64.11.15:8080/smcs/api/public/login";// 获取token路径
            String username = "admin";// 获取token登录名
            String password = "111111";// 获取token登录密码
            String sendUrl = "http://62.64.11.15:8080/smcs/api/userActive/save";// 日志推送路径*/
        //省厅日志对接，三类应用调用地址
        // 获取token路径
        String tokenUrl = "http://62.6.26.66:8080/smcs/api/public/login";
        // 获取token登录名
        String username = "admin";
        // 获取token登录密码
        String password = "111111";
        // 日志推送路径
        String sendUrl = "http://62.6.26.66:8080/smcs/api/userActive/save";

        HttpClient hc = HttpClientBuilder.create().build();
        HttpPost tokenPost = new HttpPost(tokenUrl);
        tokenPost.addHeader("Content-type", "application/json");
        Map<String, String> tokenMap = new HashMap<>(3);
        tokenMap.put("username", username);
        tokenMap.put("password", password);
        String tokenBody = JSON.toJSONString(tokenMap);
        tokenPost.setEntity(new StringEntity(tokenBody, "utf-8"));
        HttpResponse tokenResponse = hc.execute(tokenPost);
        String tokenJson = EntityUtils.toString(tokenResponse.getEntity());
        if (tokenJson != null && !Objects.equals(tokenJson, "")) {
            JSONObject json = new JSONObject(tokenJson);
            // 判断是否存在返回结果
            if (json.has("result")) {
                String returnToken = json.get("result").toString();
                if (!Objects.equals(returnToken, "") && returnToken != null) {
                    if (StringUtil.isNotEmpty(sendUrl)) {
                        HttpPost post = new HttpPost(sendUrl);
                        // 上一步获取返回结果中的token
                        post.addHeader("token", returnToken);
                        post.addHeader("Content-type", "application/json");
                        List<Map<String, String>> paramList = new ArrayList<>(1);
                        paramList.add(param);
                        String body = JSON.toJSONString(paramList);
                        post.setEntity(new StringEntity(body, "utf-8"));
                        HttpResponse sendResponse = hc.execute(post);
                        System.out.println(EntityUtils.toString(sendResponse
                                .getEntity()));
                        isTrue = true;
                    }
                }
            }
        }
        return isTrue;
    }
}
